import crypto from 'crypto';

// 生成随机数字验证码（默认6位）
export function generateRandomCode(length = 6): string {
  if (length < 4 || length > 12) {
    throw new Error('验证码长度应在4-12位之间');
  }
  
  // 使用加密安全的随机数生成器
  const buffer = crypto.randomBytes(length);
  const numbers = [];
  
  for (let i = 0; i < length; i++) {
    // 生成0-9的随机数字
    numbers.push(buffer[i] % 10);
  }
  
  return numbers.join('');
}

// 生成安全的二维码token（URL安全）
export function generateQRToken(length = 32): string {
  return crypto
    .randomBytes(Math.ceil(length * 0.75)) // Base64编码每3字节对应4字符
    .toString('base64')
    .replace(/\+/g, '-') // URL安全替换
    .replace(/\//g, '_')
    .replace(/=/g, '')
    .slice(0, length);
}

// 生成密码重置token（长期有效）
export function generateResetToken(): string {
  return crypto.randomBytes(32).toString('hex');
}

// 创建密码哈希
export async function hashPassword(password: string): Promise<string> {
  return new Promise((resolve, reject) => {
    // 生成盐值
    crypto.randomBytes(16, (err, salt) => {
      if (err) return reject(err);
      
      // 创建密码哈希
      crypto.pbkdf2(
        password,
        salt,
        310000, // 迭代次数 (OWASP推荐2023)
        32,     // 密钥长度
        'sha256',
        (err, hashed) => {
          if (err) return reject(err);
          // 格式: 算法$迭代次数$盐值$哈希值
          resolve(`pbkdf2_sha256$310000$${salt.toString('base64')}$${hashed.toString('base64')}`);
        }
      );
    });
  });
}

// 验证密码
export async function verifyPassword(password: string, hashedPassword: string): Promise<boolean> {
  return new Promise((resolve, reject) => {
    const parts = hashedPassword.split('$');
    if (parts.length !== 4 || parts[0] !== 'pbkdf2_sha256') {
      return reject(new Error('Invalid password format'));
    }
    
    const iterations = parseInt(parts[1], 10);
    const salt = Buffer.from(parts[2], 'base64');
    const hash = Buffer.from(parts[3], 'base64');
    
    crypto.pbkdf2(
      password,
      salt,
      iterations,
      hash.length,
      'sha256',
      (err, derivedKey) => {
        if (err) return reject(err);
        resolve(crypto.timingSafeEqual(hash, derivedKey));
      }
    );
  });
}